package com.wangzhenyu.learn.test.android_.resultContract

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.wangzhenyu.common.util.log.LogUtil
import com.wangzhenyu.learn.test.android_.activity.SecondTestActivity

//contract 协议
//StartActivityForResult: 通用的Contract,不做任何转换，Intent作为输入，ActivityResult作为输出，这也是最常用的一个协定。
//RequestMultiplePermissions： 用于请求一组权限
//RequestPermission: 用于请求单个权限
//TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照，返回值为Bitmap图片
//TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照，并将图片保存到给定的Uri地址，返回true表示保存成功。
//TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频，保存到给定的Uri地址，返回一张缩略图。
//PickContact: 从通讯录APP获取联系人
//GetContent: 提示用选择一条内容，返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址（content://形式） 。默认情况下，它增加了 Intent#CATEGORY_OPENABLE, 返回可以表示流的内容。
//CreateDocument: 提示用户选择一个文档，返回一个(file:/http:/content:)开头的Uri。
//OpenMultipleDocuments: 提示用户选择文档（可以选择多个），分别返回它们的Uri，以List的形式。
//OpenDocumentTree: 提示用户选择一个目录，并返回用户选择的作为一个Uri返回，应用程序可以完全管理返回目录中的文档。
//ActivityResultLauncher的注册必须在onCreate中完成
@Suppress("UNUSED")
object TestResultContract {

    //传递以及回收数据
    //传递数据
    //registerForActivityResult要放在onCreate中，而不是setOnClickListener中
    //使用方法，myActivityLauncher.launch("Hello")
    //这个使用的是自定义的ActivityResultContract<I, O>
    fun test01(activity: AppCompatActivity): ActivityResultLauncher<String> {
        return activity.registerForActivityResult(MyActivityResultContract()) {
            Toast.makeText(activity, "次数是$it", Toast.LENGTH_SHORT).show()
        }
    }

    //被跳转的Activity接收数据
    fun test02(intent: Intent) {
        val name = intent.getStringExtra("name") ?: ""
        LogUtil.d("WZY", name)
    }

    //被跳转的Activity返回数据
    fun test03(activity: AppCompatActivity) {
        val intent = Intent().apply {
            putExtra("result", 66)
        }
        activity.setResult(Activity.RESULT_OK, intent)
        activity.finish()
    }

    //使用StartActivityForResult
    //使用方式 myActivityLauncher.launch("Hello")
    fun test04(activity: AppCompatActivity): ActivityResultLauncher<Intent> {
        return activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == Activity.RESULT_OK) {
                val result = it.data?.getStringExtra("result")
                Toast.makeText(activity, result, Toast.LENGTH_SHORT).show()
            }
        }
    }

    //申请单个权限
    //使用方法 requestPermission.launch(permission.BLUETOOTH)
    fun test05(activity: AppCompatActivity): ActivityResultLauncher<String> {
        return activity.registerForActivityResult(ActivityResultContracts.RequestPermission()) {
            if (it) Log.d("WZY", "成功拿到该权限") else Log.d("WZY", "未拿到该权限")
        }
    }

    //申请多个权限
    //使用方法  requestMultiplePermissions.launch( arrayOf( permission.BLUETOOTH,permission.NFC, permission.ACCESS_FINE_LOCATION))
    fun test06(activity: AppCompatActivity): ActivityResultLauncher<Array<String>> {
        return activity.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
            permissions.entries.forEach {
                LogUtil.default01(it.toString())
            }
        }
    }
}


//跳转到另一个Activity
class MyActivityResultContract : ActivityResultContract<String, Int>() {
    override fun createIntent(context: Context, input: String): Intent {
        return Intent(context, SecondTestActivity::class.java).apply {
            putExtra("name", input)
        }
    }

    override fun parseResult(resultCode: Int, intent: Intent?): Int {
        val data = intent?.getIntExtra("result", -1)
        return if (resultCode == Activity.RESULT_OK && data != null) data else -1
    }
}

//在Lifecycle中注册ActivityResultLauncher
@Suppress("UNUSED")
class ActivityResultLifecycle(private val activity: AppCompatActivity) : DefaultLifecycleObserver {

    private lateinit var getContent: ActivityResultLauncher<String>

    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        getContent = activity.registerForActivityResult(ActivityResultContracts.GetContent()) {
            Log.d("WZY", it.toString())
        }
    }

    fun getPicture() {
        getContent.launch("image/*")
    }
}
